C'est cool de coder des carrés et des triangles, mais si ça ne s'affiche pas, c'est un petit peu bête.
Alors pour afficher tous ces machins et ces bidules tu as besoin d'utiliser la technique de bufferisation.
N'ayez pas peur de ce mot barbare, je vous explique. Lorsque vous faite un carré par exemple vous demandez à la machine de calculer des points.
Et tout les resultats des calculs sont stocker dans un buffer. Une fois que les calculs sont finis vous devez demander à la machine de vider le buffer pour que l'affichage s'effectue.
Par default on utilise le double-buffering, c'est mieux, une frame est calculée pendant que l'autre est affichée. Vous n'avez qu'à mettre SwapBuffers(DC); (si vous utilisez glut c'est glutSwapBuffers(); ) à la fin de vos calculs.
Il existe une option pour se mettre en simple-buffering, mais c'est plus lent alors oubliez. Enfin n'oublier pas de nettoyer le buffer en début de chaque frame en appelant glClear(GL_COLOR_BUFFER_BIT);.
Je vous est un peu parlé de matrices, sans vous définir exactement ce que c'est. Eh bien en fait il s'agit d'un "monde" ou vos objets sont definis. Leur mouvements sont liés à leurs matrices actives et à toutes leur matrices parentes.
Par défault, lorsqu'on dessine un objet, tous les resultats des calculs se trouvent dans la première matrice. On peut ainsi dessiner dix objets, si on utilise une transformation au debut, tous les objets subissent cette transformation. Si l'on veut que le dixième objet ne subisse pas de transformation, il faut utiliser glPushMatrix(); pour descendre d'un niveau dans la matrice, et glPopMatrix(); pour remonter d'un niveau. On peut parler d'arborescence de matrices. Ça marche comme une arborescence de fichiers, exemple:
vous avez deux dossier "c:\dossierA\" et "c:\dossierB\" avec des fichiers un peu partout.
disons que les fichiers soient des objets et que les dossiers soient des matrices.
La suppression serait alors une transformation, si on supprime le repertoire "dossierB" on supprime egalement tout les "objets" dans "dossierB", mais pas les objets qui sont dans "c:\" ou dans "c:\dossierA\". En openGL c'est pareil! |
L'exemple ci-dessus revient à faire
glPushMatrix(); | //on descend d'un niveau pour dessiner un cube. | |||
glTranslatei(5,0,0); | //une transformation | |||
glutSolidCube(1); | //on dessine le cube. | |||
glPopMatrix(); | //On remonte d'un niveau | |||
glPushMatrix(); | //.... | |||
glutSolidSphere(1,12,12); | //On dessine une sphere qui ne subit pas la transformation. | |||
glPopMatrix(); | //On oubli pas de remonter les niveaux pour pas que ca fasse des trucs bizard a la prochaine frame. |
Retour |
contact: ultrafil [AT] fr.st |